package com.luis.utils;

import org.csource.common.MyException;
import org.csource.fastdfs.*;

import java.io.IOException;

/**
 * @Author: Luis
 * @date: 2022/4/12 9:42
 * @description:
 */
public class FastDFSUtil {

    private FastDFSUtil() {
    }

    /**
     * 文件上传
     *
     * @param fileBuff    上传文件的字节数组
     * @param fileExtName 上传文件的扩展名
     * @return String数组
     * 数组中第一个元素为文件所在组名
     * 数组中第二个元素为文件所在远程路径名
     */
    public static String[] upload(byte[] fileBuff, String fileExtName) {

        try {
            //读取FastDFS配置文件，用于将所有的tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            // 使用无参构造方式创建tracker客户端对象（配合配置文件使用），用于获取tracker和storage的服务端对象
            TrackerClient tc = new TrackerClient();

            // 通过tracker客户端对象获取tracker和storage的服务端对象
            TrackerServer ts = tc.getTrackerServer();
            StorageServer ss = tc.getStoreStorage(ts);

            // 通过tracker和storage的服务端对象创建Storage客户端对象，来操作数据
            StorageClient sc = new StorageClient(ts, ss);
            /**
             * 文件上传
             *  参数1：需上传文件的字节数组
             *  参数2：文件扩展名
             *  参数3：文件的属性文件（通常不用上传）
             *  返回值：返回一个String数组，此数据非常重要，必须妥善管理，建议存入数据库
             *      数组中第一个元素为文件所在组名
             *      数组中第二个元素为文件所在远程路径名
             */
            return sc.upload_file(fileBuff, fileExtName, null);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 文件下载
     *
     * @param groupName      需下载文件的组名
     * @param remoteFileName 需下载文件的远程文件名
     * @return byte[] 需下载文件的字节数组
     */
    public static byte[] download(String groupName, String remoteFileName) {

        try {
            //读取FastDFS配置文件，用于将所有的tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            // 使用无参构造方式创建tracker客户端对象（配合配置文件使用），用于获取tracker和storage的服务端对象
            TrackerClient tc = new TrackerClient();

            // 通过tracker客户端对象获取tracker和storage的服务端对象
            TrackerServer ts = tc.getTrackerServer();
            StorageServer ss = tc.getStoreStorage(ts);

            // 通过tracker和storage的服务端对象创建Storage客户端对象，来操作数据
            StorageClient sc = new StorageClient(ts, ss);

            return sc.download_file(groupName, remoteFileName);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 文件删除
     * @param groupName 需删除文件的组名
     * @param remoteFileName 需删除文件的远程文件名
     */
    public static void delete(String groupName, String remoteFileName) {

        try {
            //读取FastDFS配置文件，用于将所有的tracker的地址读取到内存中
            ClientGlobal.init("fastdfs.conf");
            // 使用无参构造方式创建tracker客户端对象（配合配置文件使用），用于获取tracker和storage的服务端对象
            TrackerClient tc = new TrackerClient();

            // 通过tracker客户端对象获取tracker和storage的服务端对象
            TrackerServer ts = tc.getTrackerServer();
            StorageServer ss = tc.getStoreStorage(ts);

            // 通过tracker和storage的服务端对象创建Storage客户端对象，来操作数据
            StorageClient sc = new StorageClient(ts, ss);

            sc.delete_file(groupName, remoteFileName);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}
